﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using NMock2;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using Arquitetura.Architectural.Model;
using Arquitetura.Architectural.DataLayer;
using Arquitetura.Architectural.BusinessLogic;
using Arquitetura.Model;
using Arquitetura.DataLayer;
using Arquitetura.BusinessLogic;

namespace Arquitetura.BusinessLogic.Test
{
    /// <summary>
    /// Summary description for AlunoValidationUnitTest
    /// </summary>
    [TestClass]
    public class AlunoValidationUnitTest
    {
        private Mockery m_mocks;
        private IAlunoData m_mockAlunoData;
        private Aluno m_aluno;
        
        public AlunoValidationUnitTest()
        {
            m_mocks = new Mockery();
            m_mockAlunoData = m_mocks.NewMock<IAlunoData>();

            List<Aluno> listaAluno = new List<Aluno>();
            listaAluno.Add
            (
                new Aluno()
                {
                    Id = 1,
                    CPF = "57037887498",
                    RG = "1234567890",
                    Nome = "Nome",
                    Sobrenome = "Sobrenome",
                    Prontuario = "1"
                }
            );

            Resultado<IQueryable<Aluno>> resultado = 
                new Resultado<IQueryable<Aluno>>(listaAluno.AsQueryable());

            Expect.AtLeastOnce.On(m_mockAlunoData).
                Method("Select").
                WithNoArguments().
                Will(Return.Value(resultado));
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test 
        [TestInitialize()]
        public void InitializeAluno()
        {
            m_aluno = new Aluno();
            m_aluno.Nome = "Nome";
            m_aluno.Sobrenome = "Sobrenome";
            m_aluno.CPF = "71756318476";
            m_aluno.Prontuario = "0123456789";
        }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion
        [TestMethod]
        public void TestValidAlunoInitialized()
        {
            AlunoValidation alunoValidation;
            Resultado resultado;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsTrue(resultado.Sucesso);
            Assert.IsFalse(resultado.Mensagens.Any());
        }

        [TestMethod]
        public void TestPessoaFisicaNomeValidator()
        {
            AlunoValidation alunoValidation;
            Resultado resultado;

            m_aluno.Nome = null;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));

            m_aluno.Nome = string.Empty;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));

            m_aluno.Nome = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567891";
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));
        }

        [TestMethod]
        public void TestPessoaFisicaSobrenomeValidator()
        {
            AlunoValidation alunoValidation;
            Resultado resultado;

            m_aluno.Sobrenome = null;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));

            m_aluno.Sobrenome = string.Empty;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));

            m_aluno.Sobrenome = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567891";
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));
        }

        [TestMethod]
        public void TestPessoaFisicaCPFValidator()
        {
            AlunoValidation alunoValidation;
            Resultado resultado;

            m_aluno.CPF = null;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 2, resultado.ConsolidaMensagens(" | "));

            m_aluno.CPF = string.Empty;
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 2, resultado.ConsolidaMensagens(" | "));

            m_aluno.CPF = "717563184767";
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 2, resultado.ConsolidaMensagens(" | "));

            m_aluno.CPF = "7175631847";
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 2, resultado.ConsolidaMensagens(" | "));
       }

        [TestMethod]
        public void TestAlunoValidarCPFValido()
        {
            AlunoValidation alunoValidation;
            Resultado resultado;

            m_aluno.CPF = "71756318490";
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));
        }

        [TestMethod]
        public void TestAlunoValidarCPFUnico()
        {
            

            AlunoValidation alunoValidation;
            Resultado resultado;

            m_aluno.CPF = "57037887498";
            alunoValidation = new AlunoValidation(m_aluno, AlunoOperation.Insert, m_mockAlunoData);
            resultado = alunoValidation.Validar();
            Assert.IsFalse(resultado.Sucesso);
            Assert.IsTrue(resultado.Mensagens.Count == 1, resultado.ConsolidaMensagens(" | "));
        }
    }
}
